package chapter02.part06;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

/**
 * 文件加锁
 * 需要注意的是, 具体效果和操作系统有关
 * 
 * @author insight
 * @since 2021/8/25
 */
public class FileLockTest {
    public static void main(String[] args) throws IOException,
            InterruptedException {
        Path path = Paths.get("chapter02-io/src/main/resources/test.txt");
        if (!Files.exists(path)) {
            Files.createFile(path);
        }
        
        // 调用 FileChannel 来操控文件锁
        FileChannel channel = FileChannel.open(path, StandardOpenOption.WRITE,
                StandardOpenOption.READ);
        
        // lock tryLock 前者会阻塞 后者不会 不可用会立即返回 null
        // 通道关闭或调用锁的 release() 才会释放锁
        // 读写锁 可以只锁定一部分 相对的 可以获取其他部分的锁
        // 不包含 size
        FileLock lock = channel.lock(0, 4, false);
        // 共享锁
        // FileLock lock = channel.lock(0, 4, true);
        BufferedWriter out = Files.newBufferedWriter(path);
        out.write("123");
        
        // 不能由同一个虚拟机获取同一把锁 会抛出 OverlappingFileLockException
        // 要测试锁可以再写一个程序
        // System.out.println(channel.tryLock());
        
        Thread.sleep(5000);

        // 锁释放后才能关闭流
        lock.release();
        out.close();
        channel.close();
    }
}